home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 21 / AACD 21.iso / AACD / System / XFDmaster / xfd_Developer / Sources / ASM / ByteKillerClone.a < prev    next >
Encoding:
Text File  |  2001-03-25  |  24.2 KB  |  1,359 lines

  1. *******************************************************
  2. **     XFD external decruncher for CRUN Cruncher     **
  3. **        written by Mr. Larmer / Wanted Team        **
  4. **               fixed by SDI in 2000             **
  5. **  SCC! decruncher added by Codetapper 12/03/2000   **
  6. *******************************************************
  7.  
  8.         OUTPUT    "LIBS:xfd/ByteKillerClone"
  9.  
  10.         SECTION    CRUNDecrunch,CODE
  11.  
  12. ;        INCLUDE    "AINCLUDE:IncDirs.i"
  13. ;        INCLUDE    "libraries/xfdmaster.i"
  14.  
  15.         INCDIR    "sc:Include/"    ;change this as you need it
  16.         INCLUDE    "libraries/xfdmaster.i"
  17.  
  18. ; xfdForeman structure MUST be first thing in all external decrunchers
  19.  
  20. F_CRUN        moveq    #-1,d0        ;security
  21.         rts
  22.         dc.l    XFDF_ID        ;id
  23.         dc.w    1        ;version
  24.         dc.w    0
  25.         dc.l    0,0        ;private
  26.         dc.l    S_CRUN        ;first slave
  27.  
  28.         dc.b    "$VER: ByteKillerClone 2.1 (03.12.2000) by Mr.Larmer and Codetapper",0
  29. N_CRUN        dc.b    "(CRUN) Data Cruncher",0
  30. N_CRND        dc.b    "(CRND) Data Cruncher",0
  31. N_FUCK        dc.b    "(FUCK) Data Cruncher",0
  32. N_Gary        dc.b    "(Gary Symons) Data Cruncher",0
  33. N_MARC        dc.b    "(MARC) Data Cruncher",0
  34. N_TXIC        dc.b    "(TXIC) Data Cruncher",0
  35. N_xVdg        dc.b    "(xVdg) Data Cruncher",0
  36. N_AMOS        dc.b    "AMOS Compiler Cruncher",0
  37. N_ARPF        dc.b    "Action Replay II (ARPF) Data Cruncher",0
  38. N_ARP3        dc.b    "Action Replay III (ARP3) Data Cruncher",0
  39. N_ACE        dc.b    "(ACE!) Data Cruncher",0
  40. N_SCC        dc.b    "(SCC!) Data Cruncher",0
  41.         cnop    0,4
  42.  
  43. **************************************************
  44.  
  45. ; xfdSlave structure: this one doesn't support segment decrunching
  46.  
  47. S_CRUN        dc.l    S_CRND        ;more slaves
  48.         dc.w    1        ;version
  49.         dc.w    33        ;master version
  50.         dc.l    N_CRUN        ;name
  51.         dc.w    XFDPFF_DATA    ;flags
  52.         dc.w    0
  53.         dc.l    RB_CRUN        ;recog buffer
  54.         dc.l    DB_CRUN        ;decrunch buffer
  55.         dc.l    0        ;recog segment
  56.         dc.l    0        ;decrunch segment
  57.  
  58. ;-------------------------------------------------
  59.  
  60. ; Recog buffer function: receives buffer + length in a0/d0
  61.  
  62. RB_CRUN        cmp.l    #12+2,d0
  63.         ble.s    .Exit
  64.  
  65.         cmp.l    #"CRUN",(a0)
  66.         bne.s    .Exit
  67.  
  68.         moveq    #1,d0
  69.         rts
  70.  
  71. .Exit        moveq    #0,d0
  72.         rts
  73.  
  74. ;-------------------------------------------------
  75.  
  76. ;Decrunch buffer function: receives bufferinfo in a0
  77.  
  78. DB_CRUN        movem.l    d2-d7/a2-a6,-(a7)
  79.         move.l    a0,a5
  80.         move.l    xfdbi_SourceBuffer(a5),a2
  81.  
  82.         move.l    8(a2),d0
  83.  
  84.         move.l    d0,xfdbi_TargetBufSaveLen(a5)
  85.         move.l    d0,xfdbi_TargetBufLen(a5)
  86.  
  87.         move.l    xfdbi_TargetBufMemType(a5),d1
  88.         move.l    4.w,a6
  89.         jsr    -198(a6)
  90.         move.w    #XFDERR_NOMEMORY,xfdbi_Error(a5)
  91.         move.l    d0,xfdbi_TargetBuffer(a5)
  92.         beq.s    Exit
  93.  
  94.         movem.l    d1-a6,-(a7)
  95.  
  96.         move.l    d0,a1
  97.         move.l    a2,a0
  98.  
  99.         move.l    4(a0),d0
  100.         move.l    8(a0),d1
  101.         lea    12(a0),a0
  102.         movea.l    a1,a2
  103.         adda.l    d1,a2
  104.         adda.l    d0,a0
  105.         move.l    -(a0),d5
  106.         move.l    -(a0),d0
  107.  
  108.         bsr.s    D_CRUN
  109.  
  110.         movem.l    (a7)+,d1-a6
  111.  
  112.         tst.l    d0
  113.         bne.b    Error
  114.  
  115.         moveq    #1,d0
  116. Exit        movem.l    (a7)+,d2-d7/a2-a6
  117.         rts
  118.  
  119. Error
  120.         move.l    xfdbi_TargetBufLen(a5),d0
  121.         move.l    xfdbi_TargetBuffer(a5),a1
  122.         jsr    -210(a6)
  123.  
  124.         move.w    #XFDERR_CORRUPTEDDATA,xfdbi_Error(a5)
  125.         moveq    #0,d0
  126.         bra.b    Exit
  127.  
  128. **************************************************
  129.  
  130. D_CRUN
  131.         movem.l    d0-d7/a0-a6,-(sp)
  132.  
  133.         eor.l    d0,d5
  134. lbC000046:
  135.         lsr.l    #1,d0
  136.         bne.s    lbC000054
  137.         move.l    -(a0),d0
  138.         eor.l    d0,d5
  139.         move.w    #$0010,ccr
  140.         roxr.l    #1,d0
  141. lbC000054:
  142.         bcs.s    lbC0000B0
  143.         moveq    #8,d1
  144.         moveq    #1,d3
  145.         lsr.l    #1,d0
  146.         bne.s    lbC000068
  147.         move.l    -(a0),d0
  148.         eor.l    d0,d5
  149.         move.w    #$0010,ccr
  150.         roxr.l    #1,d0
  151. lbC000068:
  152.         bcs.w    lbC0000FE
  153.         moveq    #3,d1
  154.         clr.w    d4
  155. lbC000070:
  156.         subq.w    #1,d1
  157.         clr.w    d2
  158. lbC000074:
  159.         lsr.l    #1,d0
  160.         bne.s    lbC000082
  161.         move.l    -(a0),d0
  162.         eor.l    d0,d5
  163.         move.w    #$0010,ccr
  164.         roxr.l    #1,d0
  165. lbC000082:
  166.         roxl.l    #1,d2
  167.         dbra    d1,lbC000074
  168.         move.w    d2,d3
  169.         add.w    d4,d3
  170. lbC00008C:
  171.         moveq    #7,d1
  172. lbC00008E:
  173.         lsr.l    #1,d0
  174.         bne.s    lbC00009C
  175.         move.l    -(a0),d0
  176.         eor.l    d0,d5
  177.         move.w    #$0010,ccr
  178.         roxr.l    #1,d0
  179. lbC00009C:
  180.         roxl.l    #1,d2
  181.         dbra    d1,lbC00008E
  182.  
  183.         cmpa.l    a1,a2
  184.         ble.w    lbC00013A
  185.  
  186.         move.b    d2,-(a2)
  187.         dbra    d3,lbC00008C
  188.         bra.s    lbC000120
  189. lbC0000AA:
  190.         moveq    #8,d1
  191.         moveq    #8,d4
  192.         bra.s    lbC000070
  193. lbC0000B0:
  194.         moveq    #2,d1
  195.         subq.w    #1,d1
  196.         clr.w    d2
  197. lbC0000B6:
  198.         lsr.l    #1,d0
  199.         bne.s    lbC0000C4
  200.         move.l    -(a0),d0
  201.         eor.l    d0,d5
  202.         move.w    #$0010,ccr
  203.         roxr.l    #1,d0
  204. lbC0000C4:
  205.         roxl.l    #1,d2
  206.         dbra    d1,lbC0000B6
  207.         cmpi.b    #2,d2
  208.         blt.s    lbC0000F6
  209.         cmpi.b    #3,d2
  210.         beq.s    lbC0000AA
  211.         moveq    #8,d1
  212.         subq.w    #1,d1
  213.         clr.w    d2
  214. lbC0000DC:
  215.         lsr.l    #1,d0
  216.         bne.s    lbC0000EA
  217.         move.l    -(a0),d0
  218.         eor.l    d0,d5
  219.         move.w    #$0010,ccr
  220.         roxr.l    #1,d0
  221. lbC0000EA:
  222.         roxl.l    #1,d2
  223.         dbra    d1,lbC0000DC
  224.         move.w    d2,d3
  225.         moveq    #12,d1
  226.         bra.s    lbC0000FE
  227. lbC0000F6:
  228.         moveq    #9,d1
  229.         add.w    d2,d1
  230.         addq.w    #2,d2
  231.         move.w    d2,d3
  232. lbC0000FE:
  233.         subq.w    #1,d1
  234.         clr.w    d2
  235. lbC000102:
  236.         lsr.l    #1,d0
  237.         bne.s    lbC000110
  238.         move.l    -(a0),d0
  239.         eor.l    d0,d5
  240.         move.w    #$0010,ccr
  241.         roxr.l    #1,d0
  242. lbC000110:
  243.         roxl.l    #1,d2
  244.         dbra    d1,lbC000102
  245. lbC000116:
  246.         subq.w    #1,a2            ;nop
  247.  
  248.         cmpa.l    a1,a2
  249.         blt.s    lbC00013A
  250.  
  251.         move.b    0(a2,d2.w),(a2)        ;move.b -1(A2,D2.W),-(A2)
  252.         dbra    d3,lbC000116
  253. lbC000120:
  254.         cmpa.l    a2,a1
  255.         blt.w    lbC000046
  256.         tst.l    d5
  257.         bne.s    lbC00013A
  258.         movem.l    (sp)+,d0-d7/a0-a6
  259.         moveq    #0,d0
  260.         rts
  261. lbC00013A:
  262.         movem.l    (sp)+,d0-d7/a0-a6
  263.         moveq    #-1,d0
  264.         rts
  265.  
  266. **************************************************
  267.  
  268. ; xfdSlave structure: this one doesn't support segment decrunching
  269.  
  270. S_CRND        dc.l    S_FUCK        ;more slaves
  271.         dc.w    1        ;version
  272.         dc.w    33        ;master version
  273.         dc.l    N_CRND        ;name
  274.         dc.w    XFDPFF_DATA    ;flags
  275.         dc.w    0
  276.         dc.l    RB_CRND        ;recog buffer
  277.         dc.l    DB_CRND        ;decrunch buffer
  278.         dc.l    0        ;recog segment
  279.         dc.l    0        ;decrunch segment
  280.  
  281. ;-------------------------------------------------
  282.  
  283. ; Recog buffer function: receives buffer + length in a0/d0
  284.  
  285. RB_CRND        cmp.l    #12+2,d0
  286.         ble.s    .Exit
  287.  
  288.         cmp.l    #"CRND",(a0)
  289.         bne.s    .Exit
  290.  
  291.         moveq    #1,d0
  292.         rts
  293.  
  294. .Exit        moveq    #0,d0
  295.         rts
  296.  
  297. ;-------------------------------------------------
  298.  
  299. ;Decrunch buffer function: receives bufferinfo in a0
  300.  
  301. DB_CRND        movem.l    d2-d7/a2-a6,-(a7)
  302.         move.l    a0,a5
  303.         move.l    xfdbi_SourceBuffer(a5),a2
  304.  
  305.         move.l    a2,a0
  306.         add.l    xfdbi_SourceBufLen(a5),a0
  307.         move.l    -16(a0),d0
  308.  
  309.         move.l    d0,xfdbi_TargetBufSaveLen(a5)
  310.         move.l    d0,xfdbi_TargetBufLen(a5)
  311.  
  312.         move.l    xfdbi_TargetBufMemType(a5),d1
  313.         move.l    4.w,a6
  314.         jsr    -198(a6)
  315.         move.w    #XFDERR_NOMEMORY,xfdbi_Error(a5)
  316.         move.l    d0,xfdbi_TargetBuffer(a5)
  317.         beq.s    .Exit
  318.  
  319.         movem.l    d1-a6,-(a7)
  320.  
  321.         move.l    d0,a1
  322.         move.l    a2,a0
  323.         move.l    xfdbi_SourceBufLen(a5),d0
  324.  
  325.         move.l    a0,a4
  326.         adda.l    D0,A0
  327.         movem.l    -8(a0),a2/a3
  328.         movem.l    a2/a3,(a4)
  329.         LEA    -16(A0),A0
  330.         movea.l    (A0),A2
  331.         adda.l    A1,A2
  332.  
  333.         move.l    4(a0),d5
  334.         move.l    -(a0),d0
  335.  
  336.         bsr.w    D_CRUN
  337.  
  338.         movem.l    (a7)+,d1-a6
  339.  
  340.         tst.l    d0
  341.         bne.w    Error
  342.  
  343.         moveq    #1,d0
  344. .Exit        movem.l    (a7)+,d2-d7/a2-a6
  345.         rts
  346.  
  347. **************************************************
  348.  
  349. ; xfdSlave structure: this one doesn't support segment decrunching
  350.  
  351. S_FUCK        dc.l    S_Gary        ;more slaves
  352.         dc.w    1        ;version
  353.         dc.w    33        ;master version
  354.         dc.l    N_FUCK        ;name
  355.         dc.w    XFDPFF_DATA    ;flags
  356.         dc.w    0
  357.         dc.l    RB_FUCK        ;recog buffer
  358.         dc.l    DB_FUCK        ;decrunch buffer
  359.         dc.l    0        ;recog segment
  360.         dc.l    0        ;decrunch segment
  361.  
  362. ;-------------------------------------------------
  363.  
  364. ; Recog buffer function: receives buffer + length in a0/d0
  365.  
  366. RB_FUCK        cmp.l    #12+2,d0
  367.         ble.s    .Exit
  368.  
  369.         cmp.l    #"FUCK",(a0)
  370.         bne.s    .Exit
  371.         cmp.b    #"M",-4(a0,d0.l)
  372.         bne.s    .Exit
  373.         cmp.b    #"A",-3(a0,d0.l)
  374.         bne.s    .Exit
  375.         cmp.b    #"R",-2(a0,d0.l)
  376.         bne.s    .Exit
  377.         cmp.b    #"C",-1(a0,d0.l)
  378.         bne.s    .Exit
  379.  
  380.         moveq    #1,d0
  381.         rts
  382.  
  383. .Exit        moveq    #0,d0
  384.         rts
  385.  
  386. ;-------------------------------------------------
  387.  
  388. ;Decrunch buffer function: receives bufferinfo in a0
  389.  
  390. DB_FUCK        movem.l    d2-d7/a2-a6,-(a7)
  391.         move.l    a0,a5
  392.         move.l    xfdbi_SourceBuffer(a5),a2
  393.  
  394.         move.l    a2,a0
  395.         add.l    xfdbi_SourceBufLen(a5),a0
  396.         move.l    -8(a0),d0
  397.  
  398.         move.l    d0,xfdbi_TargetBufSaveLen(a5)
  399.         move.l    d0,xfdbi_TargetBufLen(a5)
  400.  
  401.         move.l    xfdbi_TargetBufMemType(a5),d1
  402.         move.l    4.w,a6
  403.         jsr    -198(a6)
  404.         move.w    #XFDERR_NOMEMORY,xfdbi_Error(a5)
  405.         move.l    d0,xfdbi_TargetBuffer(a5)
  406.         beq.s    .Exit
  407.  
  408.         movem.l    d1-a6,-(a7)
  409.  
  410.         move.l    d0,a1
  411.         move.l    a2,a0
  412.         move.l    xfdbi_SourceBufLen(a5),d0
  413.  
  414.         adda.l    D0,A0
  415.         subq.l    #4,A0
  416.         movea.l    -(A0),A2
  417.         adda.l    A1,A2
  418.         move.l    -(a0),d5
  419.         move.l    -(a0),d0
  420.  
  421.         bsr.w    D_CRUN
  422.  
  423.         movem.l    (a7)+,d1-a6
  424.  
  425.         tst.l    d0
  426.         bne.w    Error
  427.  
  428.         moveq    #1,d0
  429. .Exit        movem.l    (a7)+,d2-d7/a2-a6
  430.         rts
  431.  
  432. **************************************************
  433.  
  434. ; xfdSlave structure: this one doesn't support segment decrunching
  435.  
  436. S_Gary        dc.l    S_MARC        ;more slaves
  437.         dc.w    1        ;version
  438.         dc.w    33        ;master version
  439.         dc.l    N_Gary        ;name
  440.         dc.w    XFDPFF_DATA    ;flags
  441.         dc.w    0
  442.         dc.l    RB_Gary        ;recog buffer
  443.         dc.l    DB_Gary        ;decrunch buffer
  444.         dc.l    0        ;recog segment
  445.         dc.l    0        ;decrunch segment
  446.  
  447. ;-------------------------------------------------
  448.  
  449. ; Recog buffer function: receives buffer + length in a0/d0
  450.  
  451. RB_Gary        cmp.l    #12+2,d0
  452.         ble.s    .Exit
  453.  
  454.         cmp.b    #"G",-12(a0,d0.l)
  455.         bne.s    .Exit
  456.         cmp.b    #"a",-11(a0,d0.l)
  457.         bne.s    .Exit
  458.         cmp.b    #"r",-10(a0,d0.l)
  459.         bne.s    .Exit
  460.         cmp.b    #"y",-9(a0,d0.l)
  461.         bne.s    .Exit
  462.         cmp.b    #" ",-8(a0,d0.l)
  463.         bne.s    .Exit
  464.         cmp.b    #"S",-7(a0,d0.l)
  465.         bne.s    .Exit
  466.         cmp.b    #"y",-6(a0,d0.l)
  467.         bne.s    .Exit
  468.         cmp.b    #"m",-5(a0,d0.l)
  469.         bne.s    .Exit
  470.         cmp.b    #"o",-4(a0,d0.l)
  471.         bne.s    .Exit
  472.         cmp.b    #"n",-3(a0,d0.l)
  473.         bne.s    .Exit
  474.         cmp.b    #"s",-2(a0,d0.l)
  475.         bne.s    .Exit
  476.         cmp.b    #" ",-1(a0,d0.l)
  477.         bne.s    .Exit
  478.  
  479.         moveq    #1,d0
  480.         rts
  481.  
  482. .Exit        moveq    #0,d0
  483.         rts
  484.  
  485. ;-------------------------------------------------
  486.  
  487. ;Decrunch buffer function: receives bufferinfo in a0
  488.  
  489. DB_Gary        movem.l    d2-d7/a2-a6,-(a7)
  490.         move.l    a0,a5
  491.         move.l    xfdbi_SourceBuffer(a5),a2
  492.  
  493.         move.l    a2,a0
  494.         add.l    xfdbi_SourceBufLen(a5),a0
  495.         move.l    -16(a0),d0
  496.  
  497.         move.l    d0,xfdbi_TargetBufSaveLen(a5)
  498.         move.l    d0,xfdbi_TargetBufLen(a5)
  499.  
  500.         move.l    xfdbi_TargetBufMemType(a5),d1
  501.         move.l    4.w,a6
  502.         jsr    -198(a6)
  503.         move.w    #XFDERR_NOMEMORY,xfdbi_Error(a5)
  504.         move.l    d0,xfdbi_TargetBuffer(a5)
  505.         beq.s    .Exit
  506.  
  507.         movem.l    d1-a6,-(a7)
  508.  
  509.         move.l    d0,a1
  510.         move.l    a2,a0
  511.         move.l    xfdbi_SourceBufLen(a5),d0
  512.  
  513.         adda.l    D0,A0
  514.         LEA    -12(A0),A0
  515.         movea.l    -(A0),A2
  516.         adda.l    A1,A2
  517.         move.l    -(a0),d5
  518.         move.l    -(a0),d0
  519.  
  520.         bsr.w    D_CRUN
  521.  
  522.         movem.l    (a7)+,d1-a6
  523.  
  524.         tst.l    d0
  525.         bne.w    Error
  526.  
  527.         moveq    #1,d0
  528. .Exit        movem.l    (a7)+,d2-d7/a2-a6
  529.         rts
  530.  
  531. **************************************************
  532.  
  533. ; xfdSlave structure: this one doesn't support segment decrunching
  534.  
  535. S_MARC        dc.l    S_TXIC        ;more slaves
  536.         dc.w    1        ;version
  537.         dc.w    33        ;master version
  538.         dc.l    N_MARC        ;name
  539.         dc.w    XFDPFF_DATA    ;flags
  540.         dc.w    0
  541.         dc.l    RB_MARC        ;recog buffer
  542.         dc.l    DB_MARC        ;decrunch buffer
  543.         dc.l    0        ;recog segment
  544.         dc.l    0        ;decrunch segment
  545.  
  546. ;-------------------------------------------------
  547.  
  548. ; Recog buffer function: receives buffer + length in a0/d0
  549.  
  550. RB_MARC        cmp.l    #12+2,d0
  551.         ble.s    .Exit
  552.  
  553.         cmp.b    #"M",-4(a0,d0.l)
  554.         bne.s    .Exit
  555.         cmp.b    #"A",-3(a0,d0.l)
  556.         bne.s    .Exit
  557.         cmp.b    #"R",-2(a0,d0.l)
  558.         bne.s    .Exit
  559.         cmp.b    #"C",-1(a0,d0.l)
  560.         bne.s    .Exit
  561.  
  562.         moveq    #1,d0
  563.         rts
  564.  
  565. .Exit        moveq    #0,d0
  566.         rts
  567.  
  568. ;-------------------------------------------------
  569.  
  570. ;Decrunch buffer function: receives bufferinfo in a0
  571.  
  572. DB_MARC        movem.l    d2-d7/a2-a6,-(a7)
  573.         move.l    a0,a5
  574.         move.l    xfdbi_SourceBuffer(a5),a2
  575.  
  576.         move.l    a2,a0
  577.         add.l    xfdbi_SourceBufLen(a5),a0
  578.         move.l    -8(a0),d0
  579.  
  580.         move.l    d0,xfdbi_TargetBufSaveLen(a5)
  581.         move.l    d0,xfdbi_TargetBufLen(a5)
  582.  
  583.         move.l    xfdbi_TargetBufMemType(a5),d1
  584.         move.l    4.w,a6
  585.         jsr    -198(a6)
  586.         move.w    #XFDERR_NOMEMORY,xfdbi_Error(a5)
  587.         move.l    d0,xfdbi_TargetBuffer(a5)
  588.         beq.s    .Exit
  589.  
  590.         movem.l    d1-a6,-(a7)
  591.  
  592.         move.l    d0,a1
  593.         move.l    a2,a0
  594.         move.l    xfdbi_SourceBufLen(a5),d0
  595.  
  596.         adda.l    D0,A0
  597.         subq.l    #4,A0
  598.         movea.l    -(A0),A2
  599.         adda.l    A1,A2
  600.         move.l    -(a0),d5
  601.         move.l    -(a0),d0
  602.  
  603.         bsr.w    D_CRUN
  604.  
  605.         movem.l    (a7)+,d1-a6
  606.  
  607.         tst.l    d0
  608.         bne.w    Error
  609.  
  610.         moveq    #1,d0
  611. .Exit        movem.l    (a7)+,d2-d7/a2-a6
  612.         rts
  613.  
  614. **************************************************
  615.  
  616. ; xfdSlave structure: this one doesn't support segment decrunching
  617.  
  618. S_TXIC        dc.l    S_xVdg        ;more slaves
  619.         dc.w    1        ;version
  620.         dc.w    33        ;master version
  621.         dc.l    N_TXIC        ;name
  622.         dc.w    XFDPFF_DATA    ;flags
  623.         dc.w    0
  624.         dc.l    RB_TXIC        ;recog buffer
  625.         dc.l    DB_TXIC        ;decrunch buffer
  626.         dc.l    0        ;recog segment
  627.         dc.l    0        ;decrunch segment
  628.  
  629. ;-------------------------------------------------
  630.  
  631. ; Recog buffer function: receives buffer + length in a0/d0
  632.  
  633. RB_TXIC        cmp.l    #12+2,d0
  634.         ble.s    .Exit
  635.  
  636.         cmp.b    #"T",-4(a0,d0.l)
  637.         bne.s    .Exit
  638.         cmp.b    #"X",-3(a0,d0.l)
  639.         bne.s    .Exit
  640.         cmp.b    #"I",-2(a0,d0.l)
  641.         bne.s    .Exit
  642.         cmp.b    #"C",-1(a0,d0.l)
  643.         bne.s    .Exit
  644.  
  645.         moveq    #1,d0
  646.         rts
  647.  
  648. .Exit        moveq    #0,d0
  649.         rts
  650.  
  651. ;-------------------------------------------------
  652.  
  653. ;Decrunch buffer function: receives bufferinfo in a0
  654.  
  655. DB_TXIC        movem.l    d2-d7/a2-a6,-(a7)
  656.         move.l    a0,a5
  657.         move.l    xfdbi_SourceBuffer(a5),a2
  658.  
  659.         move.l    a2,a0
  660.         add.l    xfdbi_SourceBufLen(a5),a0
  661.         move.l    -8(a0),d0
  662.  
  663.         move.l    d0,xfdbi_TargetBufSaveLen(a5)
  664.         move.l    d0,xfdbi_TargetBufLen(a5)
  665.  
  666.         move.l    xfdbi_TargetBufMemType(a5),d1
  667.         move.l    4.w,a6
  668.         jsr    -198(a6)
  669.         move.w    #XFDERR_NOMEMORY,xfdbi_Error(a5)
  670.         move.l    d0,xfdbi_TargetBuffer(a5)
  671.         beq.s    .Exit
  672.  
  673.         movem.l    d1-a6,-(a7)
  674.  
  675.         move.l    d0,a1
  676.         move.l    a2,a0
  677.         move.l    xfdbi_SourceBufLen(a5),d0
  678.  
  679.         adda.l    D0,A0
  680.         subq.l    #4,A0
  681.         movea.l    -(A0),A2
  682.         adda.l    A1,A2
  683.         move.l    -(a0),d5
  684.         move.l    -(a0),d0
  685.  
  686.         bsr.w    D_CRUN
  687.  
  688.         movem.l    (a7)+,d1-a6
  689.  
  690.         tst.l    d0
  691.         bne.w    Error
  692.  
  693.         moveq    #1,d0
  694. .Exit        movem.l    (a7)+,d2-d7/a2-a6
  695.         rts
  696.  
  697. **************************************************
  698.  
  699. ; xfdSlave structure: this one doesn't support segment decrunching
  700.  
  701. S_xVdg        dc.l    S_AMOS        ;more slaves
  702.         dc.w    1        ;version
  703.         dc.w    33        ;master version
  704.         dc.l    N_xVdg        ;name
  705.         dc.w    XFDPFF_DATA    ;flags
  706.         dc.w    0
  707.         dc.l    RB_xVdg        ;recog buffer
  708.         dc.l    DB_xVdg        ;decrunch buffer
  709.         dc.l    0        ;recog segment
  710.         dc.l    0        ;decrunch segment
  711.  
  712. ;-------------------------------------------------
  713.  
  714. ; Recog buffer function: receives buffer + length in a0/d0
  715.  
  716. RB_xVdg        cmp.l    #12+2,d0
  717.         ble.s    .Exit
  718.  
  719.         cmp.l    #"xVdg",(a0)
  720.         bne.s    .Exit
  721.  
  722.         moveq    #1,d0
  723.         rts
  724.  
  725. .Exit        moveq    #0,d0
  726.         rts
  727.  
  728. ;-------------------------------------------------
  729.  
  730. ;Decrunch buffer function: receives bufferinfo in a0
  731.  
  732. DB_xVdg        movem.l    d2-d7/a2-a6,-(a7)
  733.         move.l    a0,a5
  734.         move.l    xfdbi_SourceBuffer(a5),a2
  735.  
  736.         move.l    4(a2),d0
  737.  
  738.         subi.l    #$c,d0
  739.         move.l    d0,xfdbi_TargetBufSaveLen(a5)
  740.         move.l    d0,xfdbi_TargetBufLen(a5)
  741.  
  742.         move.l    xfdbi_TargetBufMemType(a5),d1
  743.         move.l    4.w,a6
  744.         jsr    -198(a6)
  745.         move.w    #XFDERR_NOMEMORY,xfdbi_Error(a5)
  746.         move.l    d0,xfdbi_TargetBuffer(a5)
  747.         beq.s    .Exit
  748.  
  749.         movem.l    d1-a6,-(a7)
  750.  
  751.         move.l    d0,a1
  752.         move.l    a2,a0
  753.         move.l    xfdbi_SourceBufLen(a5),d0
  754.  
  755.         adda.l    D0,A0
  756.         movea.l    -(A0),A2
  757.         adda.l    A1,A2
  758.         move.l    -(a0),d5
  759.         move.l    -(a0),d0
  760.  
  761.         bsr.w    D_CRUN
  762.  
  763.         movem.l    (a7)+,d1-a6
  764.  
  765.         tst.l    d0
  766.         bne.w    Error
  767.  
  768.         moveq    #1,d0
  769. .Exit        movem.l    (a7)+,d2-d7/a2-a6
  770.         rts
  771.  
  772. **************************************************
  773.  
  774. ; xfdSlave structure: this one doesn't support segment decrunching
  775.  
  776. S_AMOS        dc.l    S_ARPF        ;more slaves
  777.         dc.w    1        ;version
  778.         dc.w    33        ;master version
  779.         dc.l    N_AMOS        ;name
  780.         dc.w    XFDPFF_RELOC    ;flags
  781.         dc.w    0
  782.         dc.l    RB_AMOS        ;recog buffer
  783.         dc.l    DB_AMOS        ;decrunch buffer
  784.         dc.l    0        ;recog segment
  785.         dc.l    0        ;decrunch segment
  786.  
  787. ;-------------------------------------------------
  788.  
  789. ; Recog buffer function: receives buffer + length in a0/d0
  790.  
  791. RB_AMOS        cmp.l    #4000,d0
  792.         ble.w    .Exit
  793.  
  794.         cmp.l    #$3F3,(a0)
  795.         bne.w    .Exit
  796.  
  797.         move.l    a0,-(a7)
  798.  
  799.         move.l    8(a0),d1    ;how much hunks
  800.         lsl.l    #2,d1        ; * 4
  801.         CMP.L    D1,D0
  802.         blo    .Ex
  803.         add.l    d1,a0
  804.         add.w    #$1c,a0
  805.  
  806.         cmp.l    #'CmdL',$332-$22(a0)    ; Amos Pro CLI
  807.         bne.b    .Ex1
  808.         cmp.l    #'CmdL',$3A0-$22(a0)
  809.         bne.b    .Ex1
  810.         cmp.l    #'CmdL',$490-$22(a0)
  811.         bne.b    .Ex1
  812.         cmp.l    #'xVdg',$8DE-$22(a0)
  813.         bne.b    .Ex1
  814.         bra.w    .Ok
  815. .Ex1
  816.         cmp.l    #'CmdL',$418-$22(a0)    ; Amos Pro Wb
  817.         bne.b    .Ex2
  818.         cmp.l    #'CmdL',$486-$22(a0)
  819.         bne.b    .Ex2
  820.         cmp.l    #'CmdL',$576-$22(a0)
  821.         bne.b    .Ex2
  822.         cmp.l    #'xVdg',$9C4-$22(a0)
  823.         bne.b    .Ex2
  824.         bra.b    .Ok
  825. .Ex2
  826.         cmp.l    #'CmdL',$362-$22(a0)    ; Amos Wb
  827.         bne.b    .Ex3
  828.         cmp.l    #'xVdg',$708-$22(a0)
  829.         bne.b    .Ex3
  830.         cmp.l    #'xVdg',$776-$22(a0)
  831.         bne.b    .Ex3
  832.         bra.b    .Ok
  833. .Ex3
  834.         cmp.l    #'CmdL',$262(a0)    ; Amos Wb
  835.         bne.b    .Ex31
  836.         cmp.l    #'xVdg',$5BA(a0)
  837.         bne.b    .Ex31
  838.         cmp.l    #'xVdg',$628(a0)
  839.         bne.b    .Ex31
  840.         bra.b    .Ok
  841. .Ex31
  842.         cmp.l    #'CmdL',$2D0-$22(a0)    ; Amos CLI
  843.         bne.b    .Ex
  844.         cmp.l    #'CmdL',$2F0-$22(a0)
  845.         bne.b    .Ex
  846.         cmp.l    #'CmdL',$540-$22(a0)
  847.         bne.b    .Ex
  848.         cmp.l    #'xVdg',$7B2-$22(a0)
  849.         bne.b    .Ex
  850.         cmp.l    #'xVdg',$820-$22(a0)
  851.         bne.b    .Ex
  852.  
  853. .Ok
  854.         move.l    (a7)+,a0
  855.  
  856.         move.l    8(a0),d1    ;how much hunks
  857.         add.l    $14(a0),d1    ;first hunk size
  858.         lsl.l    #2,d1        ; * 4
  859.         add.l    #$1c+$c,d1
  860.         CMP.L    D1,D0
  861.         BLO.B    .Ex
  862.         add.l    d1,a0
  863.  
  864.         cmp.l    #'xVdg',(a0)
  865.         bne.b    .Exit
  866.  
  867.         moveq    #1,d0
  868.         rts
  869. .Ex
  870.         move.l    (a7)+,a0
  871.  
  872. .Exit        moveq    #0,d0
  873.         rts
  874.  
  875. ;-------------------------------------------------
  876.  
  877. ;Decrunch buffer function: receives bufferinfo in a0
  878.  
  879. DB_AMOS        movem.l    d2-d7/a2-a6,-(a7)
  880.         move.l    a0,a5
  881.         move.l    xfdbi_SourceBuffer(a5),a2
  882.  
  883.         move.l    a2,a0
  884.         move.l    8(a0),d0    ; how much hunks
  885.         move.l    d0,d1
  886.         lsl.l    #2,d1        ; * 4
  887.         add.l    d1,a0
  888.         add.w    #$1c,a0
  889.         move.l    a0,a1
  890.         subq.l    #1,d0
  891. .Loop
  892.         cmpi.l    #'xVdg',(a0)
  893.         bne.b    .NotPacked
  894.  
  895.         add.l    4(a0),a1    ; unpack len
  896.         move.l    -4(a0),d1    ; hunk size
  897.         lsl.l    #2,d1        ; * 4
  898.         add.l    d1,a0
  899.         add.w    #$c,a0
  900.         dbf    d0,.Loop
  901.         bra.b    .Alloc
  902. .NotPacked
  903.         move.l    -4(a0),d1    ; hunk size
  904.         lsl.l    #2,d1        ; * 4
  905.         add.l    d1,a0
  906.         add.w    #$c,a0
  907.         add.l    d1,a1
  908.         add.w    #$c,a1
  909.         dbf    d0,.Loop
  910. .Alloc
  911.         sub.l    a2,a1
  912.         move.l    a1,d0
  913.  
  914.         subq.l    #8,d0
  915.         move.l    d0,xfdbi_TargetBufSaveLen(a5)
  916.         addq.l    #8,d0
  917.         move.l    d0,xfdbi_TargetBufLen(a5)
  918.  
  919.         move.l    xfdbi_TargetBufMemType(a5),d1
  920.         move.l    4.w,a6
  921.         jsr    -198(a6)
  922.         move.w    #XFDERR_NOMEMORY,xfdbi_Error(a5)
  923.         move.l    d0,xfdbi_TargetBuffer(a5)
  924.         beq.s    .Exit
  925.  
  926.         movem.l    d1-a6,-(a7)
  927.  
  928.         move.l    d0,a1
  929.         move.l    a2,a0
  930.         bsr.s    D_AMOS
  931.  
  932.         movem.l    (a7)+,d1-a6
  933.  
  934.         tst.l    d0
  935.         bne.w    Error
  936.  
  937.         moveq    #1,d0
  938. .Exit        movem.l    (a7)+,d2-d7/a2-a6
  939.         rts
  940.  
  941. **************************************************
  942.  
  943. D_AMOS
  944.         lea    $14(a1),a2        ;first hunk length
  945.         move.l    8(a0),d0        ;how much hunks
  946.         move.l    d0,d1
  947.         lsl.l    #2,d1            ; * 4
  948.         addi.w    #$1c-1,d1
  949. .Copy
  950.         move.b    (a0)+,(a1)+        ;copy header to dest
  951.         dbf    d1,.Copy
  952.         subq.w    #1,d0
  953. .Loop
  954.         cmpi.l    #'xVdg',(a0)        ;segment packed ?
  955.         bne.b    .NotPacked
  956.  
  957.         move.l    4(a0),d1        ;unpacked length
  958.         subi.w    #$c,d1
  959.         lsr.l    #2,d1            ; / 4
  960.         move.l    d1,-4(a1)
  961.         and.l    #$ff000000,(a2)        ; unpacked hunk len
  962.         add.l    d1,(a2)+
  963.  
  964.         movem.l    d0-d7/a0-a6,-(a7)
  965.  
  966.         bsr.b    .Decrunch
  967.         tst.l    d0
  968.         bne.b    .Corrupt
  969.  
  970.         movem.l    (a7)+,d0-d7/a0-a6
  971.  
  972.         add.l    4(a0),a1        ; add unpacked len
  973.         sub.w    #$c,a1
  974.         move.l    -4(a0),d1
  975.         lsl.l    #2,d1            ; * 4
  976.         add.l    d1,a0
  977.  
  978.         moveq    #$b,d1
  979. .Copy1
  980.         move.b    (a0)+,(a1)+
  981.         dbf    d1,.Copy1
  982.  
  983.         dbf    d0,.Loop
  984.         bra.b    .EndDecr
  985. .NotPacked
  986.         addq.w    #4,a2
  987.         move.l    -4(a0),d1
  988.         lsl.l    #2,d1            ; * 4
  989.         add.w    #$c-1,d1
  990. .Copy2
  991.         move.b    (a0)+,(a1)+
  992.         dbf    d1,.Copy2
  993.  
  994.         dbf    d0,.Loop
  995. .EndDecr
  996.         moveq    #0,d0
  997.         rts
  998.  
  999. .Corrupt
  1000.         movem.l    (a7)+,d0-d7/a0-a6
  1001.         moveq    #1,d0
  1002.         rts
  1003.  
  1004. .Decrunch
  1005.         move.l    8(a0),d0
  1006.         add.w    #12,D0
  1007.  
  1008.         adda.l    D0,A0
  1009.         movea.l    -(A0),A2
  1010.         adda.l    A1,A2
  1011.         move.l    -(a0),d5
  1012.         move.l    -(a0),d0
  1013.  
  1014.         bsr.w    D_CRUN
  1015.         rts
  1016.  
  1017. **************************************************
  1018.  
  1019. ; xfdSlave structure: this one doesn't support segment decrunching
  1020.  
  1021. S_ARPF        dc.l    S_ARP3        ;more slaves
  1022.         dc.w    1        ;version
  1023.         dc.w    33        ;master version
  1024.         dc.l    N_ARPF        ;name
  1025.         dc.w    XFDPFF_DATA    ;flags
  1026.         dc.w    0
  1027.         dc.l    RB_ARPF        ;recog buffer
  1028.         dc.l    DB_ARPF        ;decrunch buffer
  1029.         dc.l    0        ;recog segment
  1030.         dc.l    0        ;decrunch segment
  1031.  
  1032. ;-------------------------------------------------
  1033.  
  1034. ; Recog buffer function: receives buffer + length in a0/d0
  1035.  
  1036. RB_ARPF        cmp.l    #12+2,d0
  1037.         ble.s    .Exit
  1038.  
  1039.         cmp.l    #"ARPF",(a0)
  1040.         bne.s    .Exit
  1041.  
  1042.         moveq    #1,d0
  1043.         rts
  1044.  
  1045. .Exit        moveq    #0,d0
  1046.         rts
  1047.  
  1048. ;-------------------------------------------------
  1049.  
  1050. ;Decrunch buffer function: receives bufferinfo in a0
  1051.  
  1052. DB_ARPF        movem.l    d2-d7/a2-a6,-(a7)
  1053.         move.l    a0,a5
  1054.         move.l    xfdbi_SourceBuffer(a5),a2
  1055.  
  1056.         move.l    a2,a0
  1057.         add.l    4(a0),a0
  1058.         addq.l    #8,a0
  1059.         move.l    (a0),d0
  1060.  
  1061.         move.l    d0,xfdbi_TargetBufSaveLen(a5)
  1062.         move.l    d0,xfdbi_TargetBufLen(a5)
  1063.  
  1064.         move.l    xfdbi_TargetBufMemType(a5),d1
  1065.         move.l    4.w,a6
  1066.         jsr    -198(a6)
  1067.         move.w    #XFDERR_NOMEMORY,xfdbi_Error(a5)
  1068.         move.l    d0,xfdbi_TargetBuffer(a5)
  1069.         beq.s    .Exit
  1070.  
  1071.         movem.l    d1-a6,-(a7)
  1072.  
  1073.         move.l    d0,a1
  1074.         move.l    a2,a0
  1075.         move.l    4(a0),d0
  1076.         add.l    #12,d0
  1077.  
  1078.         adda.l    D0,A0
  1079.         movea.l    -(A0),A2
  1080.         adda.l    A1,A2
  1081.         move.l    -(a0),d5
  1082.         move.l    -(a0),d0
  1083.  
  1084.         bsr.w    D_CRUN
  1085.  
  1086.         movem.l    (a7)+,d1-a6
  1087.  
  1088.         tst.l    d0
  1089.         bne.w    Error
  1090.  
  1091.         moveq    #1,d0
  1092. .Exit        movem.l    (a7)+,d2-d7/a2-a6
  1093.         rts
  1094.  
  1095. **************************************************
  1096.  
  1097. ; xfdSlave structure: this one doesn't support segment decrunching
  1098.  
  1099. S_ARP3        dc.l    S_ACE        ;more slaves
  1100.         dc.w    1        ;version
  1101.         dc.w    33        ;master version
  1102.         dc.l    N_ARP3        ;name
  1103.         dc.w    XFDPFF_DATA    ;flags
  1104.         dc.w    0
  1105.         dc.l    RB_ARP3        ;recog buffer
  1106.         dc.l    DB_ARP3        ;decrunch buffer
  1107.         dc.l    0        ;recog segment
  1108.         dc.l    0        ;decrunch segment
  1109.  
  1110. ;-------------------------------------------------
  1111.  
  1112. ; Recog buffer function: receives buffer + length in a0/d0
  1113.  
  1114. RB_ARP3        cmp.l    #12+2,d0
  1115.         ble.s    .Exit
  1116.  
  1117.         cmp.l    #"ARP3",(a0)
  1118.         bne.s    .Exit
  1119.  
  1120.         moveq    #1,d0
  1121.         rts
  1122.  
  1123. .Exit        moveq    #0,d0
  1124.         rts
  1125.  
  1126. ;-------------------------------------------------
  1127.  
  1128. ;Decrunch buffer function: receives bufferinfo in a0
  1129.  
  1130. DB_ARP3        movem.l    d2-d7/a2-a6,-(a7)
  1131.         move.l    a0,a5
  1132.         move.l    xfdbi_SourceBuffer(a5),a2
  1133.  
  1134.         move.l    a2,a0
  1135.         add.l    4(A2),a0
  1136.         lea    $1C(a0),a0
  1137.         move.l    (a0),d0
  1138.  
  1139.         tst.l    8(A2)
  1140.         beq.b    .skip
  1141.         add.l    8(A2),A0
  1142.         sub.l    #$C00000,A0
  1143.         add.l    (A0),D0
  1144. .skip
  1145.         tst.l    12(A2)
  1146.         beq.b    .skip2
  1147.         add.l    12(A2),A0
  1148.         sub.l    #$200000,A0
  1149.         add.l    (A0),D0
  1150. .skip2
  1151.         move.l    d0,xfdbi_TargetBufSaveLen(a5)
  1152.         move.l    d0,xfdbi_TargetBufLen(a5)
  1153.  
  1154.         move.l    xfdbi_TargetBufMemType(a5),d1
  1155.         move.l    4.w,a6
  1156.         jsr    -198(a6)
  1157.         move.w    #XFDERR_NOMEMORY,xfdbi_Error(a5)
  1158.         move.l    d0,xfdbi_TargetBuffer(a5)
  1159.         beq.b    .Exit
  1160.  
  1161.         movem.l    d1-a6,-(a7)
  1162.  
  1163.         move.l    d0,a1
  1164.         move.l    a2,a0
  1165.         move.l    4(a0),d0
  1166.         add.l    #$20,d0
  1167.  
  1168.         adda.l    D0,A0
  1169.         movea.l    -(A0),A2
  1170.         adda.l    A1,A2
  1171.         move.l    -(a0),d5
  1172.         move.l    -(a0),d0
  1173.  
  1174.         bsr.w    D_CRUN
  1175.  
  1176.         move.l    xfdbi_SourceBuffer(a5),a2
  1177.         tst.l    8(A2)
  1178.         beq.b    .skip3
  1179.         addq.l    #8,A0
  1180.         add.l    (A0)+,A1
  1181.         add.l    8(A2),A0
  1182.         sub.l    #$C00000,A0
  1183.         movea.l    -(A0),A2
  1184.         adda.l    A1,A2
  1185.         move.l    -(a0),d5
  1186.         move.l    -(a0),d0
  1187.  
  1188.         bsr.w    D_CRUN
  1189. .skip3
  1190.         move.l    xfdbi_SourceBuffer(a5),a2
  1191.         tst.l    12(A2)
  1192.         beq.b    .skip4
  1193.         addq.l    #8,A0
  1194.         add.l    (A0)+,A1
  1195.         add.l    12(A2),A0
  1196.         sub.l    #$200000,A0
  1197.         movea.l    -(A0),A2
  1198.         adda.l    A1,A2
  1199.         move.l    -(a0),d5
  1200.         move.l    -(a0),d0
  1201.  
  1202.         bsr.w    D_CRUN
  1203. .skip4
  1204.         movem.l    (a7)+,d1-a6
  1205.  
  1206.         tst.l    d0
  1207.         bne.w    Error
  1208.  
  1209.         moveq    #1,d0
  1210. .Exit        movem.l    (a7)+,d2-d7/a2-a6
  1211.         rts
  1212.  
  1213. **************************************************
  1214.  
  1215. ; xfdSlave structure: this one doesn't support segment decrunching
  1216.  
  1217. S_ACE        dc.l    S_SCC        ;more slaves
  1218.         dc.w    1        ;version
  1219.         dc.w    33        ;master version
  1220.         dc.l    N_ACE        ;name
  1221.         dc.w    XFDPFF_DATA    ;flags
  1222.         dc.w    0
  1223.         dc.l    RB_ACE        ;recog buffer
  1224.         dc.l    DB_ACE        ;decrunch buffer
  1225.         dc.l    0        ;recog segment
  1226.         dc.l    0        ;decrunch segment
  1227.  
  1228. ;-------------------------------------------------
  1229.  
  1230. ; Recog buffer function: receives buffer + length in a0/d0
  1231.  
  1232. RB_ACE        cmp.l    #12+2,d0
  1233.         ble.s    .Exit
  1234.  
  1235.         cmp.l    #"ACE!",(a0)
  1236.         bne.s    .Exit
  1237.  
  1238.         moveq    #1,d0
  1239.         rts
  1240.  
  1241. .Exit        moveq    #0,d0
  1242.         rts
  1243.  
  1244. ;-------------------------------------------------
  1245.  
  1246. ;Decrunch buffer function: receives bufferinfo in a0
  1247.  
  1248. DB_ACE        movem.l    d2-d7/a2-a6,-(a7)
  1249.         move.l    a0,a5
  1250.         move.l    xfdbi_SourceBuffer(a5),a2
  1251.  
  1252.         move.l    8(a2),d0
  1253.  
  1254.         move.l    d0,xfdbi_TargetBufSaveLen(a5)
  1255.         move.l    d0,xfdbi_TargetBufLen(a5)
  1256.  
  1257.         move.l    xfdbi_TargetBufMemType(a5),d1
  1258.         move.l    4.w,a6
  1259.         jsr    -198(a6)
  1260.         move.w    #XFDERR_NOMEMORY,xfdbi_Error(a5)
  1261.         move.l    d0,xfdbi_TargetBuffer(a5)
  1262.         beq.s    .Exit
  1263.  
  1264.         movem.l    d1-a6,-(a7)
  1265.  
  1266.         move.l    d0,a1
  1267.         move.l    a2,a0
  1268.         move.l    4(a0),d0
  1269.         add.l    #12,d0
  1270.  
  1271.         move.l    8(a0),a2
  1272.         move.l    12(a0),d5
  1273.         adda.l    D0,A0
  1274. ;        movea.l    -(A0),A2
  1275.         adda.l    A1,A2
  1276. ;        move.l    -(a0),d5
  1277.         move.l    -(a0),d0
  1278.  
  1279.         bsr.w    D_CRUN
  1280.  
  1281.         movem.l    (a7)+,d1-a6
  1282.  
  1283.         tst.l    d0
  1284.         bne.w    Error
  1285.  
  1286.         moveq    #1,d0
  1287. .Exit        movem.l    (a7)+,d2-d7/a2-a6
  1288.         rts
  1289.  
  1290. **************************************************
  1291.  
  1292. ; xfdSlave structure: this one doesn't support segment decrunching
  1293. ;
  1294. ; Found in the game Viz (game loads in blocks of $200 so we'll attempt
  1295. ; to find the SCC! flag on word boundaries within $200 of the end of 
  1296. ; the file
  1297.  
  1298. SCCMinLen    equ    $200
  1299.  
  1300. S_SCC        dc.l    0        ;next slave
  1301.         dc.w    2        ;version
  1302.         dc.w    39        ;master version
  1303.         dc.l    N_SCC        ;name
  1304.         dc.w    XFDPFF_DATA|XFDPFF_RECOGLEN|XFDPFF_USERTARGET
  1305.         dc.w    0
  1306.         dc.l    RB_SCC        ;recog buffer
  1307.         dc.l    DB_SCC        ;decrunch buffer
  1308.         dc.l    0        ;recog segment
  1309.         dc.l    0        ;decrunch segment
  1310.         dc.w    0,0        ;slave/replace id
  1311.         dc.l    SCCMinLen    ;min. file length for header and data
  1312.  
  1313. RB_SCC        add.l    d0,a0
  1314.         move.l    #(SCCMinLen/2)-1,d1    ;We'll search $200 bytes backwards max
  1315.         subq.w    #2,a0
  1316.  
  1317. _Continue    subq.w    #2,a0
  1318.         cmp.l    #'SCC!',(a0)
  1319.         beq    _SCCDetected
  1320.         dbf    d1,_Continue
  1321.         moveq    #0,d0
  1322.         rts
  1323.         
  1324. _SCCDetected    move.l    -4(a0),d1
  1325.         move.l    d1,xfdrr_FinalTargetLen(a1)
  1326.         move.l    d1,xfdrr_MinTargetLen(a1)
  1327.         moveq    #1,d0
  1328.         rts
  1329.  
  1330. DB_SCC        movem.l    d2-d7/a2-a6,-(a7)
  1331.         move.l    xfdbi_UserTargetBuf(a0),a1
  1332.         move.l    xfdbi_SourceBufLen(a0),d0
  1333.         move.l    xfdbi_SourceBuffer(a0),a0
  1334.  
  1335.         movem.l    d1-d7/a1-a6,-(sp)
  1336.         bsr    RB_SCC            ;Find end of data
  1337.         movem.l    (sp)+,d1-d7/a1-a6
  1338.         
  1339.         tst.l    d0
  1340.         beq    _SCCError
  1341.  
  1342.         movea.l    -(a0),a2        ;Start of Bytekiller data
  1343.         adda.l    a1,a2
  1344.         move.l    -(a0),d5
  1345.         move.l    -(a0),d0
  1346.         bsr.w    D_CRUN
  1347.  
  1348.         tst.l    d0
  1349.         bne.w    _SCCError
  1350.  
  1351.         moveq    #1,d0
  1352.         bra    Exit
  1353.  
  1354. _SCCError    move.w    #XFDERR_CORRUPTEDDATA,xfdbi_Error(a5)
  1355.         moveq    #0,d0
  1356.         bra    Exit
  1357.  
  1358.         END
  1359.